package chat

import (
	"django_blog_gin/internal/repository"
	"django_blog_gin/internal/svc"
	"django_blog_gin/internal/utils"
	"django_blog_gin/internal/ws"
	"net/http"
	"strconv"

	"github.com/gin-gonic/gin"
)

// ChatAPI 聊天API控制器
type ChatAPI struct {
	svcCtx   *svc.ServiceContext
	chatRepo *repository.ChatRepository
}

// NewChatAPI 创建聊天API控制器
func NewChatAPI(svcCtx *svc.ServiceContext) *ChatAPI {
	return &ChatAPI{
		svcCtx:   svcCtx,
		chatRepo: repository.NewChatRepository(svcCtx),
	}
}

// GetMessages 获取历史消息
func (h *ChatAPI) GetMessages(c *gin.Context) {
	offset, _ := strconv.Atoi(c.DefaultQuery("offset", "0"))
	limit, _ := strconv.Atoi(c.DefaultQuery("limit", "50"))

	messages, err := h.chatRepo.GetMessages(offset, limit)
	if err != nil {
		utils.ResponseError(c, http.StatusInternalServerError, err.Error())
		return
	}

	utils.ResponseSuccess(c, messages, "获取成功")
}

// SearchMessages 搜索消息
func (h *ChatAPI) SearchMessages(c *gin.Context) {
	keyword := c.Query("keyword")
	offset, _ := strconv.Atoi(c.DefaultQuery("offset", "0"))
	limit, _ := strconv.Atoi(c.DefaultQuery("limit", "50"))

	if keyword == "" {
		utils.ResponseError(c, http.StatusBadRequest, "搜索关键词不能为空")
		return
	}

	messages, err := h.chatRepo.SearchMessages(keyword, offset, limit)
	if err != nil {
		utils.ResponseError(c, http.StatusInternalServerError, err.Error())
		return
	}

	utils.ResponseSuccess(c, messages, "搜索成功")
}

// UploadFile 接收文件URL（前端直接上传文件到文件服务器后，后端只保存URL）
func (h *ChatAPI) UploadFile(c *gin.Context) {
	// 获取用户信息
	userID := c.GetInt("user_id")
	userName := c.GetString("username")

	// 接收文件信息
	var fileInfo ws.FileInfo
	if err := c.ShouldBindJSON(&fileInfo); err != nil {
		utils.ResponseError(c, http.StatusBadRequest, "参数错误")
		return
	}

	// 创建文件消息
	msg := &ws.Message{
		Content:  "[文件] " + fileInfo.Name,
		Type:     "file",
		FileInfo: &fileInfo,
	}

	// 保存消息到数据库
	if err := h.chatRepo.SaveMessage(msg, userID, userName); err != nil {
		utils.ResponseError(c, http.StatusInternalServerError, "保存文件消息失败")
		return
	}

	// 广播文件消息给所有连接的客户端
	// 这里可以根据需要实现广播逻辑

	utils.ResponseSuccess(c, fileInfo, "上传成功")
}
